package com.shawn.springboot.integeration.netty.codec;

import com.shawn.springboot.integeration.netty.util.SerializationUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @author zhangjian
 * @title: RpcDecoder
 * @projectName 12-springboot学习
 * @description: 解码器
 * @date 2021/4/2711:37
 */
public class RpcDecoder extends ByteToMessageDecoder {
    private final Class<?> genericClass;                // 待反序列化的实体类的Class对象
    public RpcDecoder(Class<?> genericClass) {
        this.genericClass = genericClass;
    }
    @Override
    protected void decode(ChannelHandlerContext chc, ByteBuf in, List<Object> out)
            throws Exception {
        if (in.readableBytes() < 4) {return;}           //  判断字节流是否包含数据长度信息
        in.markReaderIndex();                           //  如果满足条件，则标记当前读
        int dataLength = in.readInt();                  //  读取字节流中的前四个字节，得到数据长度
        if (in.readableBytes() < dataLength) {          //  判断可读字节数是否大于等于数据长度
            in.resetReaderIndex();                      //  不满足条件，将读取位置重置为之前标记点
            return;
        }
        byte[] data = new byte[dataLength];
        in.readBytes(data);
        out.add(SerializationUtil.deserialize(data,genericClass));
    }
}
